import pefile  # 需安装：pip install pefile
from pathlib import Path
from typing import Optional


def is_64bit_file(file_path: Path) -> Optional[bool]:
    """
    判断文件是否为64位可执行文件（EXE/DLL）
    返回: True(64位) / False(32位) / None(无法解析)
    """
    if not file_path.exists() or not file_path.is_file():
        return None  # 文件不存在

    try:
        pe = pefile.PE(str(file_path))
        # 检查PE头中的机器类型标识
        # IMAGE_FILE_MACHINE_AMD64 对应64位，IMAGE_FILE_MACHINE_I386对应32位
        if pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_AMD64"]:
            return True
        elif pe.FILE_HEADER.Machine == pefile.MACHINE_TYPE["IMAGE_FILE_MACHINE_I386"]:
            return False
        else:
            return None  # 未知架构（如16位、ARM等）
    except pefile.PEFormatError:
        # 非PE格式文件（如文本、ZIP等）
        return None
    except Exception as e:
        # 其他解析错误（如文件损坏）
        print(f"解析文件架构失败 {file_path}: {e}")
        return None


# 测试代码
if __name__ == "__main__":
    test_file = Path(input("请输入文件路径: ").strip())
    result = is_64bit_file(test_file)
    if result is True:
        print(f"{test_file.name} 是 64位 可执行文件")
    elif result is False:
        print(f"{test_file.name} 是 32位 可执行文件")
    else:
        print(f"{test_file.name} 不是有效的PE文件或无法解析架构")